package Thread;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;

class MyExecutors {

    //用一个list保存这些线程
    public List<Thread> list = new ArrayList<>();

    // 构建一个阻塞队列，用于存放要执行任务
    // 这里指定100个任务量
    public BlockingDeque<Runnable> queue = new LinkedBlockingDeque<>(100);

    // 构造方法创建指定个线程
    public MyExecutors(int n) {
        for (int i = 0; i < n; i++) {

            // 这是线程，里面是每个线程需要去执行的代码逻辑
            Thread t = new Thread(() -> {
                while (true) {
                    // 注意，我们用的是阻塞队列，所以直接用take就行
                    // 如果队列为空，take就会将这个线程进入WAITING状态
                    try {
                        Runnable runnable = queue.take();
                        // 取出一个任务执行一个任务
                        runnable.run();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
            t.start();
            list.add(t);
        }
    }

    // submit方法，给阻塞队列里面塞任务
    public void submit(Runnable runnable) throws InterruptedException {
        queue.put(runnable);
    }
}

public class ThreadDemo28 {

    public static void main(String[] args) throws InterruptedException {
        MyExecutors executors = new MyExecutors(4);
        for (int i = 0; i < 1000; i++) {
            // 直接用i，因为变量捕获的问题，是不行的
            // 加上这样一个变量，每次进来，n都是不变的
            int n = i;
            executors.submit(() -> {
                System.out.println("执行的任务编号：" + n + "，执行线程名字：" + Thread.currentThread().getName());
            });

        }
    }
}
